package com.huawei.util;

import net.sf.jsqlparser.parser.CCJSqlParserUtil;
import net.sf.jsqlparser.statement.Statement;

import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.List;

public class SqlBatchExecutorWithJSqlParser {

    /**
     * 使用 JSqlParser 解析 SQL 文件并分批执行
     *
     * @param connection  数据库连接（需已建立）
     * @param sqlFilePath SQL 文件路径
     * @param batchSize   每批执行的语句数量（例如 100）
     * @throws IOException  文件读取异常
     * @throws SQLException SQL 执行异常
     */
    public static void executeSqlFileInBatches(Connection connection, String sqlFilePath, int batchSize)
            throws IOException, SQLException {

        // 1. 读取 SQL 文件内容
        String sqlContent = new String(Files.readAllBytes(Paths.get(sqlFilePath)));

        // 2. 使用 JSqlParser 解析所有语句
        List<Statement> parsedStatements;
        try {
            parsedStatements = CCJSqlParserUtil.parseStatements(sqlContent);
        } catch (Exception e) {
            throw new IllegalArgumentException("Failed to parse SQL file: " + e.getMessage(), e);
        }

        if (parsedStatements.isEmpty()) {
            System.out.println("No SQL statements found in the file.");
            return;
        }

        // 3. 开始批处理执行
        try (java.sql.Statement stmt = connection.createStatement()) {
            int total = parsedStatements.size();
            int executed = 0;

            for (Statement parsedStmt : parsedStatements) {
                String sql = parsedStmt.toString(); // JSqlParser 会保留原始语义
                stmt.addBatch(sql);
                executed++;

                // 达到批次大小，执行批处理
                if (executed % batchSize == 0) {
                    System.out.println("Executing batch: " + (executed - batchSize + 1) + " to " + executed);
                    stmt.executeBatch();
                    stmt.clearBatch();
                }
            }

            // 执行剩余语句
            if (executed % batchSize != 0) {
                System.out.println("Executing final batch: " + ((executed / batchSize) * batchSize + 1) + " to " + executed);
                stmt.executeBatch();
            }

            connection.commit();
            System.out.println("✅ Successfully executed " + total + " SQL statements in batches.");

        } catch (SQLException e) {
            connection.rollback();
            System.err.println("❌ SQL execution failed. Rolled back.");
            throw e;
        }
    }
}


// Java 方法实现（基础版
// import java.io.*;
//        import java.nio.file.Files;
//import java.nio.file.Paths;
//import java.sql.Connection;
//import java.sql.SQLException;
//import java.sql.Statement;
//import java.util.ArrayList;
//import java.util.List;
//
//public class SqlBatchExecutor {
//
//    /**
//     * 从 SQL 文件中读取语句并分批执行
//     *
//     * @param connection 数据库连接
//     * @param sqlFilePath SQL 文件路径
//     * @param batchSize 每批执行的语句数量（例如 100）
//     * @throws IOException 文件读取异常
//     * @throws SQLException SQL 执行异常
//     */
//    public static void executeSqlFileInBatches(Connection connection, String sqlFilePath, int batchSize)
//            throws IOException, SQLException {
//
//        // 读取整个 SQL 文件内容
//        String sqlContent = new String(Files.readAllBytes(Paths.get(sqlFilePath)));
//
//        // 简单分割 SQL 语句（按分号分割，并过滤空语句）
//        String[] statements = sqlContent.split(";");
//        List<String> validStatements = new ArrayList<>();
//
//        for (String stmt : statements) {
//            String trimmed = stmt.trim();
//            if (!trimmed.isEmpty()) {
//                validStatements.add(trimmed + ";"); // 重新加上分号
//            }
//        }
//
//        try (Statement stmt = connection.createStatement()) {
//            int count = 0;
//            for (String sql : validStatements) {
//                stmt.addBatch(sql);
//                count++;
//
//                // 达到批次大小，执行批处理
//                if (count % batchSize == 0) {
//                    System.out.println("Executing batch: " + (count - batchSize + 1) + " to " + count);
//                    stmt.executeBatch();
//                    stmt.clearBatch();
//                }
//            }
//
//            // 执行剩余未满一批的语句
//            if (count % batchSize != 0) {
//                System.out.println("Executing final batch: " + ((count / batchSize) * batchSize + 1) + " to " + count);
//                stmt.executeBatch();
//            }
//
//            connection.commit(); // 如果需要手动提交
//        } catch (SQLException e) {
//            connection.rollback(); // 出错回滚
//            throw e;
//        }
//    }
//}
//SQL 分割的局限性：上述 split(";") 无法处理字符串或注释中的分号。例如：
//INSERT INTO test VALUES ('Hello; World');
//这会导致错误分割。如需支持复杂 SQL，建议使用 JSqlParser ：
